{
function getId<T>(val : T){
  return val
}
// 尖括号在调用的时候可以省略
const res1 = getId<number>(123)
const res2 = getId<string>('123')
const res3 = getId<boolean>(false)

//添加约束
function add<T>(val:T){
  if(typeof val === 'string'){
    console.log(val.length);
  }


  return val

}
// 利用接口约束
interface ILength  {
length:number
}
function add1<T extends ILength>(val : T){
  console.log(val.length);
  return val  
}
add1('abc')

//多类型泛型 
//通过keyof定义包含关系。
function Fn<O,K extends keyof O>(obj:O,key:K){
  return obj[key]
}
const p2 = {
name:'jack',
gender:'man'
}
const p1 = Fn({name:'rose'},'name')
Fn(p2,'name')
}

